有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    由于从一个线程到另一个线程的执行在运行时总是会发生变化,而且您可能会发现生产者-消费者问题,这个问题无法在编译时模拟,因为消费者正在消耗缓冲区,一旦缓冲区被消耗,它会在那个时候通知生产者,直到生产者将等待,否则会出现异常,所以这些方法的全部逻辑都在同步块中

  2. # 2 楼答案

    调用这些方法只需要当前线程是对象监视器的所有者。然而,这可能意味着在没有从另一个同步块的上下文中进行同步的情况下调用一个方法

    例如:

    public void doWait(Object o) {
        o.wait(); // you would like the compiler to flag this
    }
    
    // but in this case it is valid
    synchronized(this)
    {
        doWait(this);
    }
    

    一般来说,现在有一种方法可以在编译时知道,当当前线程没有特定的监视器时,是否会执行任何代码段,这可能就是为什么编译器甚至不尝试标记它的原因